package com.puccampinas.finalproject.rest;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;

import org.apache.commons.lang3.StringUtils;

import com.eaio.uuid.UUID;
import com.google.gson.Gson;
import com.puccampinas.finalproject.core.controller.ActivityController;
import com.puccampinas.finalproject.core.controller.UserController;
import com.puccampinas.finalproject.core.persistence.entity.Activity;
import com.puccampinas.finalproject.core.persistence.entity.Step;
import com.puccampinas.finalproject.rest.to.RequestResponse;
import com.puccampinas.finalproject.rest.to.ResponseStatus;

@Path("/api/atividades")
public class ActivitiesHandler {


	@GET
    @Path("participar/")
    @Produces({MediaType.APPLICATION_JSON})
	public String participar(@QueryParam("usuario") Long usuario, @QueryParam("atividadeId") Long atividadeId, @QueryParam("callback") String callback) {
		
		String ticket = new UUID().toString();
		RequestResponse rp = new RequestResponse();
		rp.setTicket(ticket);
		rp.setDate(new Date());
		rp.setStatus(ResponseStatus.ERROR);
		rp.setMessage("ERROR");
		
		if (usuario != null && atividadeId != null) {
			Boolean result = ActivityController.participar(usuario,atividadeId);
			if (result) {
				rp.setStatus(ResponseStatus.OK);
				rp.setMessage("SUCCESS");
			}
		} 
		
		Gson gson = new Gson();
		String json = gson.toJson(rp);
		
		return callback + "(" + json + ")";
	}
	
	@GET
    @Path("desistir/")
    @Produces({MediaType.APPLICATION_JSON})
	public String desistir(@QueryParam("usuario") Long usuario, @QueryParam("atividadeId") Long atividadeId, @QueryParam("callback") String callback) {
		
		String ticket = new UUID().toString();
		RequestResponse rp = new RequestResponse();
		rp.setTicket(ticket);
		rp.setDate(new Date());
		rp.setStatus(ResponseStatus.ERROR);
		rp.setMessage("ERROR");
		
		if (usuario != null && atividadeId != null) {
			Boolean result = ActivityController.desistir(usuario,atividadeId);
			if (result) {
				rp.setStatus(ResponseStatus.OK);
				rp.setMessage("SUCCESS");
			}
		} 
		Gson gson = new Gson();
		String json = gson.toJson(rp);
		
		return callback + "(" + json + ")";
	}
	
	@GET
    @Path("participa/")
    @Produces({MediaType.APPLICATION_JSON})
	public String participa(@QueryParam("usuario") Long usuario, @QueryParam("atividadeId") Long atividadeId, @QueryParam("callback") String callback) {
		
		String ticket = new UUID().toString();
		RequestResponse rp = new RequestResponse();
		rp.setTicket(ticket);
		rp.setDate(new Date());
		rp.setStatus(ResponseStatus.ERROR);
		rp.setMessage("ERROR");
		
		if (usuario != null && atividadeId != null) {
			Boolean result = ActivityController.participa(usuario,atividadeId);
			if (result) {
				rp.setStatus(ResponseStatus.OK);
				rp.setMessage("SUCCESS");
			}
		} 
		
		Gson gson = new Gson();
		String json = gson.toJson(rp);
		
		return callback + "(" + json + ")";
	}
	
	@GET
    @Path("getAtividades/")
    @Produces({MediaType.APPLICATION_JSON})
	public String getAtividades(@QueryParam("partnerId") Long partnerId, @QueryParam("callback") String callback) {
		List<Activity> list = new ArrayList<Activity>();
		
		if (partnerId != null) {
			list = UserController.findAllActivities(partnerId);
		} else {
			list = ActivityController.getActivities();
		}
		
		Gson gson = new Gson();
		String json = gson.toJson(list);

		return callback + "({\"atividades\": " + json + "})";
	}
	
	@GET
    @Path("atividades/")
    @Produces({MediaType.APPLICATION_JSON})
	public String getAtividades(@QueryParam("type") String type, @QueryParam("callback") String callback) {
		
		List<Activity> atividades = new ArrayList<Activity>();
		
		if (!StringUtils.isEmpty(type)) {
			atividades = ActivityController.getActivities(type);
		}
		
		Gson gson = new Gson();
		String json = gson.toJson(atividades);

		return callback + "({\"atividades\": " + json + "})";
	}
	
	@GET
    @Path("etapas/")
    @Produces({MediaType.APPLICATION_JSON})
	public String getEtapas(@QueryParam("atividadeId") Long atividadeId, @QueryParam("callback") String callback) {
		
		List<Step> etapas = new ArrayList<Step>();
		
		if (atividadeId != null) {
			etapas = ActivityController.getSteps(atividadeId);
		}
		
		Gson gson = new Gson();
		String json = gson.toJson(etapas);

		return callback + "({\"etapas\": " + json + "})";
	}
	
}
